<?php
/**
 * Created by PhpStorm.
 * User: huizhi
 * Date: 2018/2/27
 * Time: 11:18
 */

namespace libcn\lib;


class CReceiveFile
{
    protected $aAllowExt = [];//允许扩展名
    protected $aMaxSize = 10;//上传最大限制
    protected $uploadType = "";//上传方式

    /**
     * 从$_FILES中接受文件
     * @param string $flag 文件上传标识
     * @return int 返回上传文件名、保存路径
     */
    public function ReceiveFileFromFormData( $flag='file', &$aFileInfo = "" ){
        if( empty($flag) || $_FILES[$flag]['name'] === '' || $_FILES[$flag]['error'] !== 0){
            return 1;
        }

        $info = $this->getInfo($flag);

        if(!$this->checkExt($info['name'])){
            return 2;
        }
        if(!$this->checkSize($info['size'])){
            return 3;
        }
        $filename = $this->randName().'.'.$info['name'];

        $dir = $this->createDir();
        if( !is_dir( $dir ) )
        {
            return 4;
        }

        $savePath = $dir.'/'.$filename;
        if(!$this->moveFile($info['tmp_name'], $savePath)){
            return 5;
        }else{
            $aFileInfo = [
                'path'=>$savePath,
                'origin_name'=>$info['name'],
                'size'=>$info['size'],
            ];

            return 0;
        }
    }

    /*
     *
     *
     * */
    public function ReceiveFileFromBinary($sSavePath = 'file', &$aFileInfo = "")
    {
        $content = isset( $GLOBALS['HTTP_RAW_POST_DATA'] ) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents('php://input');
        $ret = file_put_contents($sSavePath, $content, true);
        return $ret;
    }
    /**
     * 获取文件的信息
     * @param string $flag 上传文件的标识
     * @return array 上传文件的信息数组
     */
    protected function getInfo($flag){
        return $_FILES[$flag];
    }

    /**
     * 获取文件的后缀
     * @param  string $filename 文件名
     * @return string 文件扩展名
     */
    protected function getExt($filename){
        return pathinfo($filename,PATHINFO_EXTENSION);
    }

    /**
     * 检测上传文件是否合法
     * @param string $filename 文件名
     * @return bool 文件扩展名是否合法
     */
    protected function checkExt($filename){
        $ext = $this->getExt($filename);
        return in_array($ext,$this->allowExt());
    }

    /**
     * 检测文件大小是否超过限制
     * @param  int $size  文件大小
     * @return bool 文件大小是否超过限制
     */
    protected function checkSize($size){
        return $size < $this->maxSize() * 1024 * 1024;
    }

    /**
     * 随机的文件名
     * @param int $len 随机文件名的长度
     * @return string 随机字符串
     */
    protected function randName($len=6){
        return substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ234565789'),0,$len);
    }

    /**
     * 创建文件上传到的路径
     * @return string 文件上传的路径
     */
    protected function createDir( $sDir = "" ){
        if( "" == $sDir ){
            $sDir = __DIR__.'/receive/'.date('Y/m/d',time());
        }
        if(!is_dir($sDir) ){
            mkdir($sDir,0666,true);
        }

        return $sDir;
    }


    protected function moveFile( $source,$des, $nDefaultFileMode=0666 )
    {
        if( copy( $source, $des ) ){
            @unlink($source);
            //设置文件读写
            chmod(  $des, $nDefaultFileMode);
            return true;
        }
        return false;
    }


    protected function allowExt()
    {
        return array('xls','xlsx');//限制文件上传的后缀名
    }

    protected function maxSize()
    {
        return 10;   //10M
    }
}